Python爬取百度地图--瓦片图
之前的推送详细介绍了利用Python爬取百度地图的POI数据:POI数据爬虫。有同学后台留言“如何爬取百度地图”,今天在此分享。
在开始讲如何爬取之前有必要了解一些百度地图是怎样发布地图服务的。
01
介绍目前在互联网或者手机APP中提供的地图服务,例如百度地图或谷歌地图,大都是基于栅格(瓦片)模型,基本都由不同分辨率的图片构成。通过构建地图金字塔,当你想要看某个地方的地图时,根据地图的缩放级别以及浏览器的窗口大小,选择相应分辨率的图片,将其拼接成一幅局部完整的地图。当你的网速较慢时,你就会比较明显的发现地图都是一块一块加载出来的。
02
爬虫需求给定一个地址,需要把该地址周围一定范围内指定地图级别的栅格(瓦片)地图爬取下来,并且不包括地图上的标注。
03
配置文件首先给出一个配置文件。"position"给定需要爬取的地址,"map_params"给定需要爬取的地图级别,水平方向的块数,垂直方向的块数以及是否需要文字。
04
爬虫分析通过分析,我们发现每张栅格(瓦片)地图都对应一个地址。它是这样的:
https://ss1.bdstatic.com/8bo_dTSlR1gBo1vgoIiO_jowehsv/tile/?qt=vtile&x=773&y=216&z=12&styles=pl&udt=20190117&scaler=1&showtext=0
以上就是栅格(瓦片)地图的地址,其中x:水平方向的列号,y:垂直方向的行号,z:地图级别,udt:最近更新的时间,scaler:图片的比例,showtext:是否显示标注文字,这感觉就很容易了。但是当我级别或者地址变化的时候,x、y、z都是在变化的,例如:
https://ss2.bdstatic.com/8bo_dTSlR1gBo1vgoIiO_jowehsv/tile/?qt=vtile&x=6269&y=1733&z=15&styles=pl&udt=20190117&scaler=1&showtext=0
那如何确定这个x、y、z呢?
05
爬虫步骤有这样一个Web程序的测试工具---Selenium,它能够支持多种浏览器,例如Chrome、Firefox、IE等,还能支持phantomJS这种无界面浏览器。它能够自动把测试加载到指定的浏览器,模拟人操作浏览器,从而可以随意操作网页里面的内容。
所以我打算采用Python + Selenium + phantomJs这种方式来获取需要的x、y、z。我们一般是这样定位到需要的栅格(瓦片)地图:
1.在百度地图左上角输入框输入城市名,切换到相应的城市;
2.输入具体的一个地址,定位到目标栅格(瓦片)地图区域;
3.缩放到指定地图级别下;
4.通过Selenium获取网页中的x、y、z;
5.使用urlretrieve下载相应区域的栅格(瓦片)地图。
知道了步骤,那就可以开心的写代码了
部分代码如下:
06
爬虫结果这是爬取的栅格(瓦片)地图拼接后的无文字标注的局部地图。